void main(List<String> args) {
  // Person p = Person('张三', 20, '男');
  Person p = Person(name: '张三', age: 20, gender: '男');
  // p.name = '张三';
  // p.age = 20;
  p.printInfo();
  // Person p1 = Person('李四', 21, '女');
  // Person p1 = Person(age: 21, name: '李四', gender: '女');
  // p1.printInfo();

  // Person p2 = Person.of('王五', 22, '男');
  Person p2 = Person.of(name: '王五', age: 22, gender: '男');
  p2.printInfo();
}

class Person {
  //  ？和 给默认值 的区别
  //  ？表示这个变量可以为空，也可以不为空
  // 给默认值 表示这个变量必须有值，不能为空
  String? name;
  int? age;
  String? gender;

  // 四种构造函数，一种就是this.xxx=xxx， 第二种是直接传递this.xxx，这样写，顺序不能颠倒
  // 第三种是可选参数，加个大括号 传值是使用键值对的形式 key：value，顺序可以颠倒
  // 第四种是别名构造函数

  // Person(String? name, int? age, String? gender) {
  //   this.name = name;
  //   this.age = age;
  //   this.gender = gender;
  // }

  Person({this.name, this.age, this.gender});

  // Person.of(String? name, int? age, String? gender) {
  //   this.name = name;
  //   this.age = age;
  //   this.gender = gender;
  // }

  Person.of({this.name, this.age, this.gender});

  void printInfo() {
    print('name: $name, age: $age, gender: $gender');
  }
}
